###XPath解析原理:
#              1、实例化一个etree对象，将需要被解析的页面源码加载到该对象中
#              2、调用etree对象中的xpath方法，结合xpath解析式进行标签的定位和内容获取
#
#

""" 
from lxml import etree
test='''
<div>
        <ul>
            <li class="item-0">
                <a href="link1.html">1-item</a>
            </li>
            <li class="item-1">
                <a href="link2.html">2-item</a>
            </li>
            <li class="item-0">
                <a href="link3.html">3-item</a>
            </li>
            <li class="item-1">
                <a href="link4.html">4-item</a>
            </li>
            <li class="item-0">
                <a href="link5.html">5-item</a>
            </li>
        </ul>
</div>
''' 
"""
#1、使用etree.html，将html文本解析成一个element对象
#element对象：xml结构（包括html）文档的重要部分，表示文档中的标签元素，并且提供了一些方式来进行访问和操作这些元素
#           1、元素名
#           2、元素属性
#           3、父子元素
#           4、文本内容
#           5、操作方法
""" html = etree.HTML(test) """


#2、使用etree.toString()方法可以将element对象再次转换为HTML文本
""" result = etree.tostring(html)
print(result.decode('utf-8'))

with open('a.html','w') as file:
    file.write(test)
 """


##使用xpath直接打开网页
""" import html
from lxml import etree """

#etree.HTMLParser():html解析器对象，用于指定解析html文档的选项和行为。
#常用行为包括：
#remove_blank_text(默认false)： 移除html文档中的空白文本节点
#remove_comments(默认false)：   移除html上注释
#recover(默认false):            尝试修复损坏的html文档
#encoding(默认none):            指定html编码方式
""" html = etree.parse('a.html',etree.HTMLParser())
result = etree.tostring(html)
print(result.decode('utf-8'))

html_text = etree.HTMLParser(remove_comments=True,remove_blank_text=True,recover=True)
html2 = etree.parse('a.html',html_text)
result2 = etree.tostring(html2)
print(result2.decode('utf-8')) """




##xpath使用
""" html = etree.parse('a.html',etree.HTMLParser()) """
#使用xpath查询：使用/或//查询子节点或子孙节点。
#           '//*'：     表示选取所有标签节点，不论类型或者名称。
#           '//li'：    表示仅获取li标签。
#           '//li/a':   获取子标签，使用xpath获取所有位于li标签的所有a标签
#           '//li//a'： 获取子孙标签
""" result = html.xpath('//*')
print(result) """

#匹配属性：element[@attritbute='vlue']表示从文档根部开始搜索
#       element：   选择元素名称
#       @attribute：筛选的属性名称
#       value：     要匹配的属性的值
""" result1 = html.xpath("//li[@class='item-0']")
print(result1) """

#父节点：用..表示或者parent::
""" result2 = html.xpath("//a[@href='link5.html']/../@class")
print(result2) """

#文本获取：text
""" result3 = html.xpath("//li[@class='item-0']/a/text()")
print(result3) """

#属性获取
""" result4 = html.xpath("//li/a/@href")
print(result4) """
#一个属性有多个值
""" test = '''
     <li class="li item-0">
            <a href="link1.html">1-item</a>
    </li>
'''
html = etree.HTML(test)
# result5 = html.xpath("//li[@class='li item-0']/a/text()")
result5 = html.xpath("//li[contains(@class,li)]/a/text()")
print(result5) """
#一个节点有多个属性,使用xpath节点的运算符
#运算符包括：
#       <  >  =  !=  >=  <=
#逻辑运算符：and   or   not     
#字符串运算符：
#           starts-with():      检查字符串是否以指定前缀开头
#           concat():           拼接字符串
#           contains():         检查是否包含某个字符串
#           substring():        从字符串截取子字符串
#数字运算符：+   -   *   /   %

""" test = '''
    <li class="li item-0" name="yyj">
            <a href="link1.html">1-item</a>
    </li>
    <li class="li item-0">
            <a href="link1.html">2-item</a>
    </li>
        '''
html = etree.HTML(test)
result6 = html.xpath("//li[contains(@class,li) and @name='yyj']/a/text()")
print(result6) """

#按顺序查找
""" #只要第一个li节点里面的a元素的文本
result7 = html.xpath("//li[1]/a/text()")
print(result7)
#只要最后一个li节点里面的a元素的文本
result8 = html.xpath("//li[last()]/a/text()")
print(result8)
#只要前两个li节点里面的a元素的文本
result8 = html.xpath("//li[position()<3]/a/text()")
print(result8)
#只要倒数第三个li节点里面的a元素的文本
result9 = html.xpath("//li[last()-2]/a/text()")
print(result9) """